/*
* Copyright 2015 2dfire.com All right reserved. This software is the
* confidential and proprietary information of 2dfire.com ("Confidential
* Information"). You shall not disclose such Confidential Information and shall
* use it only in accordance with the terms of the license agreement you entered
* into with 2dfire.com.
*/
package com.dfire.mtm.taskNode;

import com.dfire.mtm.constant.TaskLife;
import com.dfire.mtm.executor.MtmRunnable;

import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;

/**
 * @author guipi
 * @description
 * @date 2018/10/23
 * ----------重大变更记录------------
 */
public interface TaskNode {

    /**
     * 获取节点名称
     * @return
     */
    String getName();

    /**
     * 获取父节点
     * @return
     */
    List<TaskNode> getParentNode();

    /**
     * 添加父节点
     * @param taskNode
     */
    void addParentNode(TaskNode taskNode);

    /**
     * 通过父节点名称获取指定节点
     * @param nodeName
     * @return
     */
    TaskNode getParentNode(String nodeName);

    /**
     * 获取子节点
     * @return
     */
    List<TaskNode> getChildrenNode();

    /**
     * 添加子节点
     * @param childrenNode
     */
    void addChildrenNode(List<TaskNode> childrenNode);

    /**
     * 根据子节点名称获取指定子节点
     * @param nodeName
     * @return
     */
    TaskNode getChildrenNode(String nodeName);

    /**
     * 通知节点任务状态
     * @param task
     * @param taskLife
     * @return
     */
    boolean notifyTaskStatus(String nodeName,String task, TaskLife taskLife);

    /**
     * 存储数据
     * @param task 任务批次
     * @param nodeName 来源节点
     * @param <T>
     * @return
     */
    <T> boolean store(String task,String nodeName,T t);

    /**
     * 设置线程池
     * @param executor
     * @return
     */
    void setExecutor(ExecutorService executor);

    /**
     * 获取线程池
     * @return
     */
    ExecutorService getExecutor();

    /**
     * 设置执行器
     * @return
     */
    void setRunnable(MtmRunnable mtmRunnable);

    /**
     * 获取执行器
     * @return
     */
    MtmRunnable getRunnable();

    /**
     * 任务执行业务逻辑
     */
    void execute();

    /**
     * 是否存在数据
     * @return
     */
    boolean existData();

    /**
     * 下一个批次的数据
     * @return
     */
    <T> TaskData<T> nextData();

    /**
     * 获取某批次数据
     * @param task
     * @param <T>
     * @return
     */
    <T> T getData(String task);

    /**
     * 给所有子节点发送数据
     * @param task
     * @param data
     * @param <T>
     * @return
     */
    <T> boolean pushData(String task,T data);

    /**
     * 给指定子节点发送数据
     * @param task
     * @param nodeName
     * @param data
     * @param <T>
     * @return
     */
    <T> boolean pushData(String task,String nodeName,T data);

    /**
     * 检查任务是否完成
     * @param task
     * @return
     */
    boolean taskIsFinished(String task);

    boolean stopTask(String task);

    boolean stop();
}
